home *** CD-ROM | disk | FTP | other *** search
- /* $VER: NextTeXError.ged V 0.6 © 1994 Fin Schuppenhauer */
- /**
- Liefert ausgehend von der aktuellen This macro returns the next error
- Zeile den nächsten Fehler im Quell- following the current line in the
- text. (das funktioniert hier aller- current (La)TeX source. (only the
- dings nur zeilenweise, d.h., wenn first error in a line will be found)
- es mehrere Fehler in einer Zeile The cursor is placed on that line
- gibt, wird nur der erste gefunden.) and the errormessage will be shown
- Der Cursor wird auf diese Stelle in a requester.
- positioniert und die (La)TeX-Fehler- As a special feature, this macro
- meldung in einem Requester ange- also works with sources, loaded by
- zeigt. another (La)TeX file.
- Als besonderes Feature können auch In this case, be sure you called
- Quelltexte nach Fehlern untersucht this macro from the main file (and
- werden, die von einer anderen TeX- it will find the logfile).
- Datei nachgeladen wurden. In diesem If you recompile your source, you
- Fall muß der erste Aufruf vom Haupt- must clear the clip variable
- file aus geschehen, damit das Log- 'texfiles' and may close the
- file gefunden und geladen werden logfile-window.
- kann. The tinny macro "ResetTeXError.ged"
- Wird der Quelltext neu übersetzt, will do that for you.
- sollte das Logfile-Fenster ge-
- schlossen werden, vor allem aber
- die Clip-Variable 'texfiles' mit-
- tels CALL SETCLIP('texfiles') ge-
- löscht werden (Das Mini-Makro
- "ResetTeXErrors.ged" erledigt dies.
-
- Interner Ablauf:
- Zunächst wird der Dateiname des akt-
- Fensters ermittelt und überprüft, ob
- er auf .tex endet und somit ein pot-
- entieller (La)TeX-Quelltext ist.
- Ist die Clip-Variable 'texfiles'
- nicht definiert, so lädt dieses
- Makro das zugehörige Logfile (falls
- vorhanden), durchsucht diese nach
- dazugeladenen Dateien (.tex), ver-
- merkt diese inkl. dem Namen des Log-
- files/-fenster in 'texfiles' und er-
- zeugt für jede gefundene Datei eine
- weitere Clip-Variable mit der Start-
- und Endzeile im Quelltext.
- Anderfalls wird nun das Logfile-
- Fenster geLOCKt, der Cursor auf die
- Startzeile entsprechend des aktuel-
- len Quelltextes positioniert und die
- erste Fehlerkennung (l.) gesucht.
- Diese wird nun überprüft, ob sie zum
- aktuellen Quelltext gehört und wenn
- ja auf die aktuelle Zeile im Quell-
- text folgt.
-
- Dieses Makro ist PUBLIC DOMAIN. This macro is PUBLIC DOMAIN.
-
- Für weitere Anregungen, Fehlerhin- For bug reports, suggestions,
- weise und wie man besser in ARexx greetings or anything else, send
- programmiert (dies ist einer meiner a postcard (or similary) to:
- ersten Versuche!) bin ich jederzeit
- dankbar. Fin Schuppenhauer
- Mein Adresse: Brausspark 10
- D - 20537 Hamburg
- Fin Schuppenhauer (Germany)
- Braußpark 10
- 20537 Hamburg
-
- Oder über E-Mail: Or use e-mail:
-
- schuppen@rzdspc2.informatik.uni-hamburg.de
-
- Zum Abschluß noch einen besonderen
- Dank an Dietmar Eilert für seinen
- GoldED und an Georg Heßmann für
- sein PasTeX (wann kommt 1.4 ?).
-
- **/
-
- OPTIONS RESULTS /* enable return codes */
-
- if (LEFT(ADDRESS(), 6) ~= "GOLDED") then /* not started by GoldEd ? */
- address 'GOLDED.1'
-
- 'LOCK CURRENT' /* lock GUI, gain access */
- OPTIONS FAILAT 6 /* ignore warnings */
- SIGNAL ON SYNTAX /* ensure clean exit */
-
-
- /* ------------------------ INSERT YOUR CODE HERE: ------------------- */
-
- 'QUERY CAT'
- isGerman = (result = "deutsch")
-
- /* RexxSupport.library öffnen: */
- if ~show('L', "rexxsupport.library") then do
- if ~addlib('rexxsupport.library',0,-30,0) then do
- if (isGerman) then
- 'REQUEST BODY="rexxsupport.library kann nicht geöffnet werden!" BUTTON="So''n Mist"'
- else
- 'REQUEST BODY="Unable to open rexxsupport.library!" BUTTON="That''s bad!'
- 'UNLOCK'
- EXIT
- end
- end
-
- 'QUERY DOC VAR DOCNAME'
-
- /* Haben wir auch einen (La)TeX-Quelltext im aktuellen Fenster? Dann */
- /* muß er ja auf .tex oder .sty enden: */
- if (right(docname,4) ~= '.tex') & (right(docname,4) ~= '.sty') then do
- if (isGerman) then
- 'REQUEST BODY="Dies ist kein (La)TeX-Quelltext." BUTTON=Ok'
- else
- 'REQUEST BODY="This is no (La)TeX source." BUTTON=Ok'
- 'UNLOCK'
- EXIT
- end
-
- lp = 0
- lp = lastpos('/', docname)
- if lp = 0 then
- lp = lastpos(':', docname)
- filename = right(docname, length(docname)-lp)
-
- /* Aktuelle Zeilennummer holen. Von hier aus wird der nächste Fehler */
- /* gesucht. */
- 'QUERY ABSLINE VAR CURRLINE'
-
- logname = left(docname,length(docname)-3) || 'log'
-
- if ~show('C','texfiles') then do
- /* Das kann nur bedeuten, daß es noch kein Logfile geladen wurde: */
- if exists(logname) then do
- /* Logfile existiert: Ist es auch älter als das .tex/.sty-File?: */
- docinfo = statef(docname)
- loginfo = statef(logname)
- docdays = subword(docinfo,5,1)
- docmins = subword(docinfo,6,1)
- doctick = subword(docinfo,7,1)
- logdays = subword(loginfo,5,1)
- logmins = subword(loginfo,6,1)
- logtick = subword(loginfo,7,1)
- if (doctick > logtick) & (docmins >= logmins) & (docdays >= logdays) then do
- if (isGerman) then
- 'REQUEST BODY="Logfile ist älter als aktueller Text!|Bitte erst neu übersetzen." BUTTON=Ok'
- else
- 'REQUEST BODY="Logfile is older then current text!|Please, compile first." BUTTON=Ok'
- 'UNLOCK'
- EXIT
- end
-
- 'UNLOCK'
- /* Jetzt schalten wir um auf das Fenster mit unserem .log-File. */
- /* Sollte es ein deartiges Fenster nicht geben, sorgt dir Option */
- /* FORCE dafür, daß das Logfile gleich geladen wird. */
- /* Läßt es sich eigentlich verhindern, daß das neugeladene Fenster*/
- /* nach vorne geholt und aktiviert wird? */
- 'WINDOW USE='logname' FORCE QUIET'
- 'LOCK NAME='logname' QUIET'
-
- /* Nun durchsuchen wir den Text nach dazugeladenen .tex-Dateien */
- /* und merken uns deren Namen, sowie den Zeilenbereich, den sie */
- /* beanspruchen (das hilft uns unten bei der Überprüfung, ob der */
- /* nächste gefundene Fehler auch zum aktuellen Quelltext gehört): */
- texfile = logname
- /* Das Hauptfile taucht zweimal auf (1. in der Parameterübergabe */
- /* zum TeX-Aufruf; 2. die Information daß das Hauptfile dazuge- */
- /* laden wurde. Danach können wir die Suche beginnen): */
- 'FIND STRING='filename' FIRST'
- 'FIND STRING=.tex NEXT'
- done = 0
- do until done ~= 0
- 'FIND STRING=.tex NEXT QUIET'
- if rc = 0 then do
- 'PING 1'
- 'PREV'
- 'QUERY WORD VAR WORT'
- texfile = texfile' 'wort || '.tex'
- /* Jetzt bestimmen wir den Zeilenbereich, denn diese */
- /* Datei im Logfile beansprucht: */
- 'FIND STRING=( PREV'
- 'QUERY ABSLINE VAR STARTLINE'
- 'PING 0'
- ddone = 0
- do until ddone ~= 0
- 'BRACKET MATCH'
- if rc = 0 then
- ddone = 1
- else do
- /* Keine passende schließende Klammer gefunden. */
- /* Dies kann passieren, wenn der Übersetzungsvor- */
- /* gang vorzeitig mit x unterbrochen wurde. */
- 'GOTO BOTTOM'
- 'GOTO EOL STEP 1'
- 'TEXT T=)'
- 'PONG 0'
- end
- end
- 'QUERY ABSLINE VAR ENDLINE'
- /* Die geholten Daten sichern: */
- clipvalue = startline' 'endline
- call setclip(wort'.tex', clipvalue)
- /* Zurück zu der Stelle, wo wir .tex gefunden haben: */
- 'PONG 1'
- end
- else
- /* Keine weitere .tex-Datei gefunden. */
- done = 1
- end
- call setclip('texfiles', texfile)
-
- /* Alle dazugeladenen .tex-Files gefunden und gesichert. */
- /* Jetzt positionieren wir uns auf den Beginn des aktuellen */
- /* Textes im Logfile und können dann unten mit der Fehler- */
- /* suche beginnen. */
- startline = subword(getclip(filename), 1)
- endline = subword(getclip(filename), 2)
- 'GOTO LINE='startline
- end
- else do
- if (isGerman) then
- 'REQUEST BODY="Logfile nicht gefunden!" BUTTON=Ok'
- else
- 'REQUEST BODY="Logfile not found!" BUTTON = Ok'
- 'UNLOCK'
- EXIT
- end
- end
- /* Es gibt im Clip einen Eintrag texfiles, d.h. das Logfile wurde */
- /* bereits geladen. */
- else do
- /* Ist unsere akt. Datei auch darin enthalten, d.h. gibt es */
- /* im Clip einen Eintrag, der unserem Filenamen entspricht? */
- texfiles = getclip('texfiles')
- clipvalue = getclip(filename)
- if rc ~= 0 then do
- if (isGerman) then
- 'REQUEST BODY="Kein Hinweis auf diese Datei|im geladenen Logfile!" BUTTON=Ok'
- else
- 'REQUEST BODY="No information for this file|in loaded logfile!" BUTTON="I see"'
- 'UNLOCK'
- EXIT
- end
- startline = subword(clipvalue, 1, 1)
- endline = subword(clipvalue, 2, 1)
- logwindow = subword(texfiles, 1, 1)
- 'UNLOCK'
- /* FORCE, falls das Fenster zwischenzeitlich geschlossen wurde: */
- 'WINDOW USE='logwindow' FORCE QUIET'
- 'LOCK NAME='logwindow' QUIET'
- end
-
- /* Hier beginnt nun endlich die Fehlersuche: */
- 'GOTO LINE='startline
- done = 0
- do until done ~= 0
- 'FIND STRING=l. NEXT QUIET'
- if rc = 0 then do
- /* Fehlerkennung gefunden: */
- 'QUERY COLUMN VAR CURRCOL'
- if currcol <= 2 then do
- /* Die Fehlerkennung steht immer zu Beginn der Zeile, wie hier. */
- 'QUERY ABSLINE VAR ERROCCLINE'
- if erroccline > endline then do
- /* Diese Fehlermeldung gehört nicht zum aktuellen */
- /* Quelltext. */
- line = 0
- done = 1
- end
- else do
- /* Gut, die Fehlermeldung liegt im gültigen Bereich. */
- /* Aber innerhalb dieses Bereiches könnte eine weitere*/
- /* tex-Datei dazu geladen worden sein. Wenn die hier */
- /* gefundene Fehlermeldung in so einem Bereich liegen */
- /* sollte, gehört sie nicht zu unserem aktuellen Text */
- /* und die Suche muß fortgesetzt werden: */
- si = 1
- aw = words(texfiles)
- do until (word(texfiles, si) = filename) | (si > aw)
- si = si + 1
- end
- ddone = 0
- do j = si+1 to aw while ddone = 0
- file = subword(texfiles, j, 1)
- /*if file ~= filename then do*/
- sline = subword(getclip(file), 1, 1)
- eline = subword(getclip(file), 2, 1)
- if (sline <= erroccline) & (eline >= erroccline) then
- ddone = 1
- end
- if ddone = 0 then do
- /* Das sieht gut aus. Zeilennummer holen (l.xxx): */
- 'GOTO STEP=2'
- 'QUERY WORD VAR ERRORLINE'
- if errorline > currline then do
- line = errorline
- done = 1
- end
- end
- end
- end
- end
- else do
- /* Keine weitere Fehlerkennung gefunden: */
- line = 0
- done = 1
- end
- end
-
- if line ~= 0 then do
- /* Ja, es gab noch einen weiteren Fehler. Jetzt besorgen wir */
- /* uns noch die zugehörige Fehlermeldung: */
- /* (Wir erkennen sie an einem ! in der ersten Spalte.) */
- done = 0
- do until done ~= 0
- 'FIND STRING=! PREV'
- 'QUERY COLUMN VAR CURRCOL'
- if currcol = 1 then
- done = 1
- end
- 'QUERY BUFFER VAR CURRBUF'
- currbuf = delword(currbuf, 1 , 1)
- 'UNLOCK'
-
- /* Gut, jetzt haben wir alle notwendigen Informationen aus */
- /* dem Logfile extrahiert und können nun zurück auf unseren */
- /* Quelltext schalten, den Cursor auf die fehlerhafte Zeile */
- /* positionieren und die Fehlermeldung ausgeben: */
- 'LOCK NAME='docname
- 'GOTO LINE='line
- if (isGerman) then
- 'REQUEST BODY="Fehler in Zeile 'line':|'currbuf'" BUTTON=Ok'
- else
- 'REQUEST BODY="Error in line 'line':|'currbuf'" BUTTON=Ok.'
- end
- else do
- 'UNLOCK'
- 'LOCK NAME='docname
- if (isGerman) then
- 'REQUEST BODY="Kein weiterer Fehler." BUTTON=Ok'
- else
- 'REQUEST BODY="No more errors." BUTTON=Ok'
- end
-
-
- /* ---------------------------- END OF YOUR CODE --------------------- */
-
- 'UNLOCK' /* VERY important: unlock GUI */
- EXIT
-
- SYNTAX:
-
- SAY "Sorry, error line" SIGL ":" ERRORTEXT(RC) ":-("
- 'UNLOCK'
- EXIT
-
-